package control;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;

import principal.PrincipalAcademico;

import dao.ContaDAO;

import model.Conta;

import view.Interface;
import view.JanelaConta;

public class Controler {

	private Interface janela;
	private JanelaConta janelaConta;
	private Conta conta = null;
	private static ContaDAO contaDAO;

	public Controler(Interface j){
		this.janela = j;

		/*try{
			// Obtem o ContaDAO
			contaDAO = Principal.javabase.getContaDAO();
			System.out.println("ContaDAO obtida com sucesso: " + contaDAO);
		}catch(Exception e){
			e.printStackTrace();
		}*/
	}

	public void registraEventos(){
		janela.getBtnNovaConta().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				adicionar();
			}			
		});

		janela.getBtnRemoverConta().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				remover();
			}			
		});

		janela.getBtnEditarConta().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				editar();
			}			
		});

		janela.getBtnConsultarConta().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				consultar();			
			}			
		});

		janela.getMenuItemAdicionar().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				adicionar();			
			}			
		});

		janela.getMenuItemRemover().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				remover();			
			}			
		});

		janela.getMenuItemEditar().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				editar();			
			}			
		});

		janela.getMenuItemConsultar().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				consultar();			
			}			
		});		
	}

	public void adicionar(){
		janelaConta = new JanelaConta("Adicionar Conta");
		janela.lancarFrame(janelaConta);

		janelaConta.getBtnOk().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				if(validaGUI()){
					conta = (Conta)janelaConta.getBean();
					if(conta != null){
						try{
							contaDAO.create(conta);
						}catch(Exception err){
							err.printStackTrace();
							JOptionPane.showMessageDialog(
									janela,
									"Erro ao inserir dados no banco.",
									"ERRO",
									JOptionPane.ERROR_MESSAGE);
						}finally{
							janelaConta.dispose();
						}
					}
				}
			}			
		});

		janelaConta.getBtnCancelar().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				janelaConta.dispose();
			}			
		});		
	}

	public void remover(){
		janelaConta = new JanelaConta("Remover Conta", true, false, false);
		janela.lancarFrame(janelaConta);

		janelaConta.getBtnOk().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				if(validaGUI()){
					conta = (Conta)janelaConta.getBean();
					if(conta != null){
						try{
							contaDAO.delete(conta);
						}catch(Exception err){
							err.printStackTrace();
							JOptionPane.showMessageDialog(
									janela,
									"Erro ao remover dados no banco.",
									"ERRO",
									JOptionPane.ERROR_MESSAGE);
						}finally{
							janelaConta.dispose();
						}
					}
				}
			}
		});

		janelaConta.getBtnCancelar().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				janelaConta.dispose();
			}			
		});	

		janelaConta.getBtnBuscar().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				if((janelaConta.getTxtNomeCliente().getText() != null && janelaConta.getTxtSenha().getText() != null) &&
						(!janelaConta.getTxtNomeCliente().getText().equals("") && !janelaConta.getTxtSenha().equals(""))){
					try{
						janelaConta.desdetalhar();
						Conta conta = contaDAO.find(
								janelaConta.getTxtNomeCliente().getText(), 
								janelaConta.getTxtSenha().getText());
						janelaConta.desdetalhar();
						janelaConta.setBean(conta);

					}catch(Exception err){
						err.printStackTrace();
						JOptionPane.showMessageDialog(
								janela,
								"Erro ao buscar dados no banco.",
								"ERRO",
								JOptionPane.ERROR_MESSAGE);
					}
				}else{
					JOptionPane.showMessageDialog(
							janela,
							"Campo de busca vazio.",
							"ERRO",
							JOptionPane.ERROR_MESSAGE);
				}
			}			
		});	
	}

	public void editar(){
		janelaConta = new JanelaConta("Editar Conta", false, true, false);
		janela.lancarFrame(janelaConta);

		janelaConta.getBtnOk().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				if(validaGUI()){
					conta = (Conta)janelaConta.getBean();
					if(conta != null){
						try{
							contaDAO.update(conta);
						}catch(Exception err){
							err.printStackTrace();
							JOptionPane.showMessageDialog(
									janela,
									"Erro ao remover dados no banco.",
									"ERRO",
									JOptionPane.ERROR_MESSAGE);
						}finally{
							janelaConta.dispose();
						}
					}
				}
			}			
		});

		janelaConta.getBtnCancelar().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				janelaConta.dispose();
			}			
		});	

		janelaConta.getBtnBuscar().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				if((janelaConta.getTxtNomeCliente().getText() != null && janelaConta.getTxtSenha().getText() != null) &&
						(!janelaConta.getTxtNomeCliente().getText().equals("") && !janelaConta.getTxtSenha().equals(""))){
					try{
						janelaConta.desdetalhar();
						Conta conta = contaDAO.find(
								janelaConta.getTxtNomeCliente().getText(), 
								janelaConta.getTxtSenha().getText());
						janelaConta.desdetalhar();
						janelaConta.setBean(conta);

					}catch(Exception err){
						err.printStackTrace();
						JOptionPane.showMessageDialog(
								janela,
								"Erro ao buscar dados no banco.",
								"ERRO",
								JOptionPane.ERROR_MESSAGE);
					}
				}else{
					JOptionPane.showMessageDialog(
							janela,
							"Campo de busca vazio.",
							"ERRO",
							JOptionPane.ERROR_MESSAGE);
				}
			}			
		});	
	}

	public void consultar(){
		janelaConta = new JanelaConta("Consultar Conta", false, false, true);
		janela.lancarFrame(janelaConta);

		janelaConta.getBtnOk().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				janelaConta.dispose();
			}			
		});

		janelaConta.getBtnBuscar().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				if(janelaConta.getRadioButtonBuscaNome().isSelected()){
					if((janelaConta.getTxtNomeCliente().getText() != null && janelaConta.getTxtSenha().getText() != null) &&
							(!janelaConta.getTxtNomeCliente().getText().equals("") && !janelaConta.getTxtSenha().equals(""))){
						try{
							janelaConta.desdetalhar();
							Conta conta = contaDAO.find(
									janelaConta.getTxtNomeCliente().getText(), 
									janelaConta.getTxtSenha().getText());
							janelaConta.desdetalhar();
							janelaConta.setBean(conta);

						}catch(Exception err){
							err.printStackTrace();
							JOptionPane.showMessageDialog(
									janela,
									"Erro ao buscar dados no banco.",
									"ERRO",
									JOptionPane.ERROR_MESSAGE);
						}
					}else{
						JOptionPane.showMessageDialog(
								janela,
								"Campo de busca vazio.",
								"ERRO",
								JOptionPane.ERROR_MESSAGE);
					}
				}else{
					if((janelaConta.getTxtNumeroConta().getText() != null && !janelaConta.getTxtNumeroConta().getText().equals(""))){
						try{
							Conta conta = contaDAO.find(Long.parseLong(janelaConta.getTxtNumeroConta().getText()));
						}catch(Exception err){
							err.printStackTrace();
							JOptionPane.showMessageDialog(
									janela,
									"Erro ao buscar dados no banco.",
									"ERRO",
									JOptionPane.ERROR_MESSAGE);
						}
					}else{
						JOptionPane.showMessageDialog(
								janela,
								"Campo de busca vazio.",
								"ERRO",
								JOptionPane.ERROR_MESSAGE);
					}
				}
			}
		});

		janelaConta.getRadioButtonBuscaNome().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				janelaConta.detalhar();
			}
		});

		janelaConta.getRadioButtonBuscaNumeroConta().addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				janelaConta.detalhar();
			}
		});
	}

	public boolean validaGUI(){

		String strErro = "";

		if(janelaConta.getTxtNomeCliente().getText().equals("")){
			strErro += "- Campo nome cliente vazio.\n";
		}

		if(janelaConta.getTxtSenha().getText().equals("")){
			strErro += "- Campo senha vazio.\n";
		}

		if(janelaConta.getTxtNumeroConta().getText().equals("")){
			strErro += "- Campo numero da conta vazio.\n";
		}

		if(janelaConta.getTxtSaldoConta().getText().equals("")){
			strErro += "- Campo saldo conta vazio.\n";
		}

		if(!strErro.equals("")){
			JOptionPane.showMessageDialog(
					janela, 
					strErro,
					"ERRO",
					JOptionPane.ERROR_MESSAGE);
			return false;
		}

		return true;
	}
}
